﻿//
//作业标题(735)
//调整奇数偶数顺序
//作业内容
//调整数组使奇数全部都位于偶数前面。
//题目：
//
//输入一个整数数组，实现一个函数，
//
//来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分，
//所有偶数位于数组的后半部分。

//#include<stdio.h>
//void odd_even(int arr[],int sz)
//{
//	int add[100] = { 0 };
//	int even[100] = { 0 };
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		if (arr[i] % 2 == 0)//奇数
//		{
//			even[i] = arr[i];
//		}
//		else//偶数
//		{
//			add[i] = arr[i];
//		}
//	}
//	int a = sizeof(add)/sizeof(add[0]);
//	int e = sizeof(even) / sizeof(even[0]);
//	int j = 0;
//	for (j = 0; j < e; j++)
//	{
//		arr[j] = even[j];
//	}
//	for (j = 0; j < a; j++)
//	{
//		arr[e + j] = add[j];
//	}
//}
//int main()
//{
//	int arr[20] = {1,2,3,4,5,6,7,8,9,10};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	odd_even(arr,sz);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}
//

//
//作业标题(736)
//strcpy实现
//
//作业内容
//模拟实现库函数strcpy

//#include<stdio.h>
//char* my_strlen(char* arr1, char *arr2, int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		arr2[i] = arr1[i];
//	}
//	return arr2;
//}
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[10] = { 0 };
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	char* ret = my_strlen(arr1, arr2,sz);
//	printf("%s", ret);
//	return 0;
//}



//
//作业标题(737)
//strlen实现
//
//作业内容
//模拟实现库函数strlen

//#include<stdio.h>
//size_t my_strlen(char* arr)
//{
//	size_t count = 0;
//	while (*arr)
//	{
//		count++;
//		arr++;
//	}
//	return count;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	size_t ret = my_strlen(arr);
//	printf("%zd", ret);
//	return 0;
//}

//
//作业标题(1325)
//杨氏矩阵
//作业内容
//有一个数字矩阵，矩阵的每行从左到右是递增的，矩阵从上到下是递增的，请编写程序在这样的矩阵中查找某个数字是否存在
//#include<stdio.h>
//int main()
//{
//	//创造一个矩阵谢谢你
//	int i = 0;
//	int j = 0;
//	printf("请输入你想要的矩阵大小\n");
//	int size = 0;//矩阵的大小
//	scanf_s("%d", &size);
//	for (i = 0; i < size; i++)//每列
//	{
//	   //每行
//		for (j = 0; j < size; j++)
//		{
//			printf("%-2d ", i + j);
//		}
//		printf("\n");
//	}
//	//查找某个数
//	int n = 0;
//	printf("请输入你需要在矩阵中查找的数字\n");
//	scanf_s("%d", &n);
//	for (i = 0; i < size; i++)//每列
//	{
//		//每行
//		for (j = 0; j < size; j++)
//		{
//			if (i + j == n)
//				printf("找到了它在第%-2d列，第%-2d行\n", i, j);
//		}
//	}
//	printf("很遗憾矩阵没有次数\n");
//	return 0;
//}



////练习使用库函数，qsort排序各种类型的数据
//#include<stdio.h>
///*void qsort(void* base, size_t num, size_t size,
//	int (*compar)(const void*, const void*))*///最后一个参数是函数指针
//
//
////具体类型比较函数
//int compar_int(void* p1, void* p2)//这个必须与qsort的最后一个参数必须一致
//{
//	return *(int*)p1 - *(int*)p2;
//}
//void test()
//{
//	int arr[10] = { 1,2,3,4,5,9,8,7,6,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, 10, 4, compar_int);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//int main()
//{
//	test();
//	return 0;
//}



////练习使用库函数，qsort排序各种类型的数据
//#include<stdio.h>
//#include<string.h>
///*void qsort(void* base, size_t num, size_t size,
//	int (*compar)(const void*, const void*))*///最后一个参数是函数指针
//struct Book
//{
//	char name[20];
//	float price;
//};//这个要在上面大哥
//
//	//具体类型比较函数
//int compar_struct(void* p1, void* p2)//这个必须与qsort的最后一个参数必须一致
//{
//	//return  (*((struct Book*)p1)).name ,(*((struct Book*)p2)).name;//❌
//	return  strcmp(((struct Book*)p1)->name , ((struct Book*)p2)->name);//字符串不能这么比较
//}
//
//void test()
//{
//	struct Book s[] = {{"lao",41.8},{"hai",55.8},{"ta",66.9}};//结构体数组
//	int sz = sizeof(s) / sizeof(s[0]);
//	//比较两个结构体
//	//从名字比较
//	qsort(s ,3 , sizeof(s[0]), compar_struct);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%s ", s[i]);
//	}
//	
//}
//
//int main()
//{
//	test();
//	return 0;
//}




//#include<stdio.h>
//#include<stdlib.h>
//#include<string.h>//strcmp的头文件
////
////void qsort(void* base,
////	size_t num,
////	size_t size,
////	int (*compar)(const void*, const void*));
//
//struct Stu
//{
//	char name[20];
//	int age;
//};
////结构体数据怎么比较呢？
////按照年龄比较
////按照名字比较
//
////按照年龄
//void compar_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//	//return (*(struct Stu*)e1).age - (*(struct Stu*)e2).age;
//}
//void test2()
//{
//	struct Stu arr[] = { {"zhangsan",20},{"lisi",30},{"wangwu",12} };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), compar_stu_by_age);
//
//}
////按照名字
//void compar_stu_by_name(const void* e1, const void* e2)
//{
//	//return strcmp((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//	return (*(struct Stu*)e1).name - (*(struct Stu*)e2).name;
//}
//void test2()
//{
//	struct Stu arr[] = { {"zhangsan",20},{"lisi",30},{"wangwu",12} };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), compar_stu_by_name);
//
//}
//
//int main()
//{
//	test2();
//	return 0;
//}

//
//
//作业标题(1372)
//qsort模拟实现
//
//作业内容
//模仿qsort的功能实现一个通用的冒泡排序

//#include<stdio.h>
//
//void change(void *p1,void *p2)
//{
//	int i = 0;
//	for (i = 0; i < ; i++)
//	{
//		(char*)p1 = (char*)p2;
//	}
//}
//void bubble_sort(void* base,
//	size_t num,
//	size_t size,
//	int (*compar)(const void*, const void*))
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < size; i++)
//	{
//		for (j = 0; j < size - 1 - i; j++)
//		{
//			if ()
//			{
//				change();
//			}
//		}
//	}
//}
//
//int compar_int(const void* p1, const void* p2)
//{
//	return *(int*)p1 - *(int*)p2;
//}
//
//void test()
//{
//	int arr[] = { 1,2,3,8,7,6,5,4,10,9 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz, sizeof(arr[0]),compar_int);
//}
//int main()
//{
//	test();
//	return 0;
//}





//
//作业标题(1445)
//模拟实现strlen
//
//作业内容
//模拟实现strlen

//#include<stdio.h>
//size_t my_strlen(char arr[])
//{
//	char* ps = arr;
//	while(*arr)
//	{
//		arr++;
//	}
//	return arr-ps;
//}
//int main()
//{
//	char arr[] = "abcedf";
//	size_t ret = my_strlen(arr);
//	printf("%zd ", ret);
//}



//
//作业标题(1449)
//模拟实现strcpy
//
//作业内容
//模拟实现strcpy
//
//#include<stdio.h>
//char* my_strcpy(char* arr1, char* arr2, int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		arr2[i] = arr1[i];
//	}
//	return arr2;
//}
//int main()
//{
//	char arr1[] = "abcdef";
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	char arr2[] = { 0 };
//	char* s = my_strcpy(arr1, arr2, sz);
//	printf("%s", s);
//	return 0;
//}


//作业标题(1451)
//模拟实现strcmp
//
//作业内容
//模拟实现strcmp
//#include<stdio.h>
//int my_strcmp(char* arr1, char* arr2,int sz)
//{
//
//	while (*arr1++ == *arr2++)
//	{
//		;
//	}
//	if (arr1 > arr2)
//	{
//		return 1;
//	}
//	else
//	{
//		return -1;
//	}
//}
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[] = "abcdzf";
//	int sz = sizeof(arr1)/sizeof(arr1[0]);
//	int ret = my_strcmp(arr1, arr2,sz);
//	if (ret == 0)
//	{
//		printf("=\n");
//	}
//	else if (ret > 0)
//	{
//		printf("arr1>arr2");
//	}
//	else
//	{
//		printf("arr1<arr2");
//	}
//	return 0;
//}


//作业标题(1456)
//模拟实现strcat
//
//作业内容
//模拟实现strcat
//#include<stdio.h>
//#include<assert.h>
//char* my_strcat(char* arr1, const char* arr2)
//{
//	assert(arr1 && arr2);
//	//保存arr1d的起始地址
//	char* p = arr1;
//	//找到arr1字符串的结尾处
//	while (*arr1)
//	{
//		arr1++;
//	}
//	//把arr2地址拷贝过去
//	while (*arr1++ = *arr2++)//==和=姐姐我都要哭了
//	{
//		;
//	}
//	return p;
//}
//int main()
//{
//	char arr1[30] = "abcdef";
//	char arr2[20] = "ghijk";
//	//现在把arr2的内容追加到arr1上面去，返回arr1的首元素地址
//	my_strcat(arr1, arr2);
//	printf("%s", arr1);
//	return 0;
//}


//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//char* my_strcat(char* str1, const char* str2)
//{
//	assert(str1 && str2);//断言
//	//strcat函数返回的是目标空间的起始地址
//	char* ret = str1;
//	//1，找到目标空间的末尾
//	while (*str1 != '\0')
//		//	while (*str1++)❌?????????????
//		//后置++ 先使用  再*
//	{
//		str1++;
//	}
//	//2。数据追加
//	while (*str1++ = *str2++)
//		//后置++的规则
//	{
//		;
//	}
//	return ret;
//}
//
//int main()
//{
//	char arr1[20] = "abc";//这里必须写空间大小
//	char arr2[20] = "defg";
//	my_strcat(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}




//作业标题(1458)
//模拟实现strstr
//
//作业内容
//模拟实现strstr
//////在字符串中找字符串
//#include<stdio.h>
//#include<assert.h>
//char* my_strstr(char* arr1, char* arr2)
//{
//	assert(arr1 && arr2);//断言
//	//需要两个去移动的指针，保持arr12不动
//	char* p1 = arr1;
//	char* p2 = arr2;
//	//需要一个指针去返回第一次出现arr2的起始地址
//	char* ps = arr1;
//	//
//	while (*p2)
//	{
//		p2 = arr2;
//		ps = p1;
//		if (*p1 != *p2)
//		{
//			p1++;
//			ps++;
//		}
//		while (*p1 == *p2)
//		{
//			p1++;
//			p2++;
//		}
//		if (*p1 == '\0')
//			return NULL;
//	}
//	return ps;
//
//}
//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[10] = "bcd";
//	//返回值是要寻找字符串第一次出现的位置
//	char* s = my_strstr(arr1, arr2);
//	printf("%s", s);
//	return 0;
//}



//
//
//作业标题(1462)
//模拟实现memcpy
//
//作业内容
//模拟实现memcpy
//复制各种类型
//#include<stdio.h>
//void my_memcpy(void* arr1, void* arr2,int num)//一个字节一个字节传
//{
//	int n = 0;
//	while (n<num)
//	{
//		*(char*)arr2 = *(char*)arr1;
//		((char*)arr1)++;
//		((char*)arr2)++;
//		n++;
//	}
//}
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//	int num = sizeof(arr1);
//	my_memcpy(arr1, arr2,40);//字节
//
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}


//作业标题(1463)
//模拟实现memmove
//
//作业内容
//模拟实现memmove
////含有重叠部分
//#include<stdio.h>
//void my_memmove(void* p1, void* p2,size_t num)
////p2拷贝到p1
//{
//	//从前往后拷贝
//	if (p2 > p1)
//	{
//		while (num--)
//		{
//			*(char*)p1 = *(char*)p2;
//			((char*)p1)++;
//			((char*)p2)++;
//		}
//	}
//	//从后往前拷贝
//	else//p2<p1
//	{
//		while (num--)
//		{
//			(char*)p1=(char*)p1 + num;
//			(char*)p2=(char*)p2 + num;
//			*(char*)p1 = *(char*)p2;
//		}
//	}
//
//
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5 };
//	//把3，4，5拷贝到1 2 3上面
//	//把1 2 3拷贝到 3 4 5上面上去
//	my_memmove(arr, arr+2,12);
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}


//int main()
//{
//    unsigned char puc[4];
//    struct tagPIM
//    {
//        unsigned char ucPim1;
//        unsigned char ucData0 : 1;
//        unsigned char ucData1 : 2;
//        unsigned char ucData2 : 3;
//    }*pstPimData;
//    pstPimData = (struct tagPIM*)puc;
//    memset(puc, 0, 4);
//    pstPimData->ucPim1 = 2;//010  0010
//    pstPimData->ucData0 = 3;//1 -011    1
//    pstPimData->ucData1 = 4;//2 -100   00
//    pstPimData->ucData2 = 5;//3-101     101
//    printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
//    //      
//    return 0;
//}